﻿#ifndef __SS_TIME_H__
#define __SS_TIME_H__
#include "../ssBaseDefine.h"
#ifndef SS_USE_WINDOWS
#include <sys/time.h>
#endif
#include <time.h>

#define SS_TIME_STR_LEN 32

namespace StarSeeker
{

struct ssYMDHMS
{
	ST32_u year;
	ST32_u month;
	ST32_u day;
	ST32_u wday;
	ST32_u yday;
	ST32_u hour;
	ST32_u minute;
	ST32_u second;

	void Zero();
	void GetLocalTime(char* buf);
};

class ssTime
{
public:
	//获得当前时戳,以秒为单位,从1970年1月1日开始
	static ST64_u GetTimeNow();
	//获得当前时戳,以毫秒为单位,从1970年1月1日开始
	static ST64_u GetTimeNowMS();
	//获取当前时
	static tm* GetTime();
	static tm* GetTime(time_t timestamp);
	static void GetTime(ssYMDHMS& t);
	static void GetTime(time_t timestamp, ssYMDHMS& out);
	static time_t GetTimestamp(ssYMDHMS& t);
	//获取当前本地时
	static tm* GetLocalTime();
	static tm* GetLocalTime(time_t timestamp);
	static void GetLocalTime(ssYMDHMS& t);
	static void GetLocalTime(time_t timestamp, ssYMDHMS& out);
	static time_t GetLocalTimestamp(ssYMDHMS& t);
	//格式化成字符串
	static void GetLocalTime(char* buf);
	//格式化成字符串: 年.月.日
	static void GetLocalTimeYMD(char* buf);
	//格式化成字符串: 年.月.日.时
	static void GetLocalTimeYMDH(char* buf);
	//格式化成字符串: 时:分:秒
	static void GetLocalTimeHMS(char* buf);
	//将日期格式化成数字
	static ST32_u GetDateNum(bool localTime);
	//将时间格式化成数字
	static ST32_u GetTimeNum(bool localTime);
	//设置时区，默认+8
	static void SetTimeZone(i32 zone);
	//计算零点时间戳
	static ST64_u GetDayZero(time_t timestamp);
	//计算今日零点
	static ST64_u GetTodayZero();
	//计算日差
	static i32 GetDayDiff(time_t timestamp1, time_t timestamp2);
	//进程启动时间
	static time_t GetStart();
private:
	//时区
	static i32		s_timeZone;
	//今日零点，需要每天刷新该值
	static time_t	s_todayZero;
	//进程启动时间
	static time_t	s_sysStart;
};

}
#endif
